<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>分派技术</title>
</head>
<body>
    <h3>变量类型</h3>
    <p>
        在java中变量的数据类型分为静态类型和实际类型。例如：Map map = new HashMap; 变量map的静态类型是Map.class,实际类型是HashMap.clas。
    </p>
    <h3>分派</h3>
    <p>
        根据对象的类型而对方法进行的选择，就是分派（dispatch），由于数据类型分为2类，所以分派也分为静态分派和动态分派。
    </p>
    <h3>静态分派 static dispatch</h3>
    <p>
        静态分派发生在编译阶段，静态分派根据静态类型调用。
        Java中体现为：方法重载静态
        表现形式为：方法重载调用时根据实参的静态类型进行方法选择。
    </p>
    <h3>动态分派 dynamic dispatch</h3>
    <p>
        动态分派发生在运行阶段，动态分派动态的置换掉某个方法。
        java体现为：方法重写
        表现形式为：根据变量的实际数据类型调用重写的方法
    </p>

    <h3>双分派</h3>
    <p>
        定义：双分派技术就是在调用一个方法的时候，不仅要根据消息接收者（对象）的运行分派区分，还要根据实参实际数据类型分派。
    </p>
    <p>
        官方说明：双分派实现动态绑定的本质，就是在重载方法调用的前面加上了继承体系中的覆盖环节，由于覆盖（重写）是动态的，所以重载也就变成了动态的。
        白话：在调用重载的方法前，先调用重写的方法，获取到参数的真实数据类型，再调用重载方法可以到达运行分派效果（详看doubleDispatch包内容）。
    </p>
</body>
</html>
